#ifndef TANSDEAL_HPP_029_384_372_256_348_769_876_495_764
#define TANSDEAL_HPP_029_384_372_256_348_769_876_495_764

#include <mimalloc.h>
#include <cstring>
#include <cstdint>

/*  单元数据组(构造规则见UDP_Fields_Packet.cpp)
    UDP构造规则
    0----------------7 0----------------7 0----------------7 0---------5----6-------7
    |---------------Magic---------------| |------Type------| |-GroupID-| |-ACK-| |-TSC-|

    0----------------7 0----------------7 0----------------7 0----------------7
    |-------------------------------SourceUsreID------------------------------|

    0----------------7 0----------------7 0----------------7 0----------------7
    |-------------------------------SerialCode--------------------------------|

    0----------------7 0----------------7 0----------------7 0----------------7
    |---------------CRC16---------------| |-----------UsrDataLength-----------|

    0-------------------------------------------------------------UsrDataLength
    |---------------------------------负载数据---------------------------------|
*/
struct UDP_PDU{
    uint16_t Magic;         //初级校验码 2
    uint8_t  Type;          //数据类型 1
    uint8_t  GroupID;       //分组ID 1
    bool     ACK;           //是否需要回ACK包
    bool     TSC;           //是否要求时序性
    uint32_t SourceUsreID;  //源用户ID 4
    uint32_t SerialCode;    //时序序列码 4
    uint16_t CRC16;         //数据校验码 2
    uint16_t UsrDataLength; //负载数据长度 2
    uint8_t* UsrData;       //负载数据
    UDP_PDU(UDP_HPP&);      //解析构造函数
    UDP_PDU();              //空白构造函数
    UDP_PDU(const UDP_PDU&);      //拷贝构造函数
    ~UDP_PDU();
    UDP_HPP Build();

    //运算符重载 =
    void operator=(UDP_PDU&);
    //运算符重载 ==
    bool operator==(UDP_PDU&);
    //运算符重载 !=
    bool operator!=(UDP_PDU&);
};
//头部-载荷对
struct UDP_HPP{
    uint8_t* Data;  //数据
    std::size_t Length; //长度
    UDP_HPP(UDP_PDU&); //整合构造函数
    UDP_HPP(uint8_t*, std::size_t); //填充构造函数
    UDP_HPP(); //空白构造函数
    UDP_HPP(const UDP_HPP&); //拷贝构造函数
    ~UDP_HPP(); //析构
    UDP_PDU Analysis();  //解析
    bool LegalVerify();  //合法性校验
    bool MagicVerify(uint16_t); //初级校验码校验

    //迭代器接口begin
    uint8_t* begin();
    //迭代器接口end
    uint8_t* end();
    //迭代器接口size
    std::size_t size();

    //运算符重载 =
    void operator=(UDP_HPP&);
    //运算符重载 ==
    bool operator==(UDP_HPP&);
    //运算符重载 !=
    bool operator!=(UDP_HPP&);
};

uint16_t CRC16(uint8_t* data, uint16_t length);
UDP_HPP UDP_HPP_Build(UDP_PDU&);
UDP_PDU UDP_PDU_Analysis(UDP_HPP&);

#include "TansDeal.cpp"
#endif